/*
 * @Author       : DonnieLiang
 * @Date         : 2022-08-23 
 * @Version      : 1.0
 * @Description  : tcp_client_app
 */



//  #include "tcp_api_01.h" 


#ifndef __TCP_API_01_H__
#define __TCP_API_01_H__

#include <netinet/in.h>
#include <stdint.h>
#include <bits/pthreadtypes.h>




//#define TCP_CLIENT_RX_BUFSIZE	(1500u)	    //定义tcp client最大接收数据长
//#define TCP_CLIENT_RX_BUFSIZE	(3000u)	    //定义tcp client最大接收数据长 readAttr命令  1500u 的数据长度不够用---
//#define TCP_CLIENT_RX_BUFSIZE	(8*1024u)	  
#define TCP_CLIENT_RX_BUFSIZE	(8*1024u)	  

//#define TCP_CLIENT_TX_BUFSIZE	(1500u)		//200---定义tcp client最大发送数据长
//#define TCP_CLIENT_TX_BUFSIZE	(2*1024u)  
#define TCP_CLIENT_TX_BUFSIZE	(8*1024u)   //ver.1.52  


// //tcp服务器连接通道
enum tcp_api_channel
{
	TCP_API_CH_IOTV30 = 0,		//连接到上行HW传感器服务器---
	TCP_API_CH_LOCAL,		   //连接到本地服务器
	TCP_API_CH_MAX		      ////tcp通道数

}; 



#pragma pack(1)   //不加pack(1)会导致指针操作发生奇怪的问题 


typedef struct {
volatile	int fd;
	struct sockaddr_in addr;
	pthread_t tid;

} ClientInfo_st;




typedef struct  {

uint8_t    Flag ; 

uint16_t   Len ; 
uint16_t   Size ;  
uint8_t    Buff[TCP_CLIENT_TX_BUFSIZE]; 
	
} Tcp_TxData_st;



typedef struct  {

uint8_t    Flag ; 

uint16_t   Len ; 
uint16_t   Size ;  
uint8_t    Buff[TCP_CLIENT_RX_BUFSIZE]; 
	
} Tcp_RxData_st;

					
			
//TCP Client 测试全局状态标记变
//bit7:0,没有数据要发1,有数据要发
//bit6:0,没有收到数据;1,收到数据
//bit5:0,没有连接上服务器;1,连接上服务器
//bit4~0:保留			

typedef	 union 
{
		uint8_t  all;   //178  --
		struct         
		{					 						
				uint8_t    res:6;         //bit4~0:保留		
				uint8_t    link:1;        //bit5:0,没有连接上服务器;1,连接上服务器
                uint8_t    reset:1;			  //复位TCP链接 
			
			//	uint8_t    rx:1;          //bit6:0,没有收到数据;1,收到数据				
			//	uint8_t    tx:1;  				//bit7:0,没有数据要发1,有数据要发

		} bit;
		
	
} tcp_client_flag_u;


#pragma pack()



typedef void(*pvoid_func)(void) ;



typedef struct  {
 //pvoid_func tcp_reset;   //等效方法
 void(*tcp_reset)(void) ;
 uint8_t (*IsTcpClientConnected) (void);   //iotv30_IsTcpClientConnected
}  tcp_api_obj_st;




// //tcp服务器连接状
// enum tcp_client_states
// {
// 	ES_TCPCLIENT_NONE = 0,		//没有连接
// 	ES_TCPCLIENT_CONNECTED,		//连接到服务器
// 	ES_TCPCLIENT_CLOSING,		//关闭连接
// }; 


 extern ClientInfo_st   ClientInfo[TCP_API_CH_MAX];
//extern tcp_client_flag_u  tcp_client_flag;
extern Tcp_TxData_st  Tcp_TxData[TCP_API_CH_MAX];
extern Tcp_RxData_st  Tcp_RxData[TCP_API_CH_MAX];


 void Tcp_API_Init(void);



//返回值 0---发送失败，1---发送成功
uint8_t TCP_API_Send(uint8_t ch, uint8_t* data,uint16_t len );
//返回值 0---发送失败，1---发送成功
uint8_t TCP_API_Send_Now(uint8_t ch, uint8_t* data,uint16_t len );

int tcp_connect(const char *ip, const char *port);

int tcp_client_connect(ClientInfo_st* pinfo);

int set_socket_keepalive(int sockfd);


#endif     //__TCP_API_01_H__











